/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.Lid;
import org.hibernate.Session;
import org.hibernate.Transaction;
import persistence.SessionManager;
import security.ActivationKey;
import util.SendMail;
import util.ValidateMail;

/**
 *
 * @author Niels Leguit <niels.leguit at hva.nl>
 */
public class MijnBeheer_WijzigGebruikerController extends HttpServlet {

    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        HttpSession sessie = request.getSession();

        Session session = null;
        session = SessionManager.openSession();

        Transaction tx = session.beginTransaction();

        Lid editLid;

// Hier komt de check op:
// of aanroeper rechten heeft tot wijzigen andermans gegevens
// of alleen z'n eigen.
        // is user ingelogd?
        if (null == sessie.getAttribute("currentUser")) {
            // User IS NOT logged in....    
            System.out.println("User is niet ingelogd - Redir naar Login pagina");
            response.sendRedirect("Login");
        } else {
            // User IS logged in....

            //Wat is de ID van user in current session        
            Lid currLid = (Lid) sessie.getAttribute("currentUser");
            int currLidID = currLid.getLidId();
            // Controleer of er een id is meegestuurd
            Map<String, String[]> parameterMap = request.getParameterMap();
            if (parameterMap.isEmpty()) {
                // Er komt geen url mee  --> new user aanmaak
                editLid = new Lid();
            } else {
                // get ID van meegezonde wijzigngs verzoek vanuit URL
                int urlLidId = Integer.parseInt(request.getParameter("id"));
                // check op ID is ID van current session
                // if false: check current user rolID -->
                //      if >= 4 dan get editLid met ID van URL
                //      if <= 3 dan kan alleen eigen gegevens geweizigd worden.
                if (currLidID == urlLidId) {
                    // ID via url == ID van currentUser
                    editLid = currLid;
                } else {
                    if (currLid.getRolId() >= 4) {
                        // ID via url komt van een user met roID >= 4
                        editLid = (Lid) session.load(Lid.class, new Integer(urlLidId));
                    } else {
                        // verzoek via url komt van iemand zonder de juiste rechten
                        editLid = currLid;
                    }
                }
            }
            // Sla de juiste te wijzigen lid op in sessie
            sessie.setAttribute("editLid", editLid);

            System.out.println("Redir naar mijnBeheer_wijzigGebruiker.jsp met lidID: " + editLid.getLidId());
            response.sendRedirect("mijnBeheer_WijzigGebruiker.jsp");

        }
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        System.out.println("1 (Start)");
        String fname = new String();
        String tussenvoegsel = new String();
        String lname = new String();
        String displaynaam = new String();

        String emailAdres = new String();
        String password = new String();

        String postalcode = new String();
        String huisnummer = new String();
        String provincie = new String();

        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        Date now = new Date();
        Date geboorteDatum = new Date();

        boolean newUser = false;
        boolean activated = false;
        boolean deleted = false;

        // Bij geen selectie wordt user altijd "gast"
        int rolId = 1;

        boolean validity = true;
        String address;

        HttpSession sessie = request.getSession();

        Lid editLid;
        editLid = (Lid) sessie.getAttribute("editLid");
        
        if (editLid.getLidId() != null) {
//            editLid = (Lid) sessie.getAttribute("editLid");
            System.out.println("2a (LidId: " + editLid.getLidId() + ")");
        } else {
            System.out.println("2b (new user)");
            newUser = true;
            editLid = new Lid();
        }

        Session session = null;
        session = SessionManager.openSession();
        Transaction tx = session.beginTransaction();

// hier begint de input vanaf de de myBeheer_WijzigGebruiker.jsp pagina        
        if (request.getParameter("fname") != null && !request.getParameter("fname").isEmpty()) {
            fname = request.getParameter("fname");
            editLid.setLidVnaam(fname);
        } else {
            request.setAttribute("naam", "Naam is leeg");
            validity = false;
        }
        if (request.getParameter("lname") != null && !request.getParameter("lname").isEmpty()) {
            lname = request.getParameter("lname");
            editLid.setLidAnaam(lname);
        } else {
            request.setAttribute("name", "Achternaam is leeg");
            validity = false;
        }
        if (request.getParameter("password") != null && !request.getParameter("password").isEmpty()) {
            password = request.getParameter("password");
            editLid.setLidPassword(password);  
        } else {
            request.setAttribute("word", "Wachtwoord is incorrect");
            validity = false;
        }
        if (!request.getParameter("provincie").equals("")) {
            provincie = request.getParameter("provincie");
            editLid.setLidProvincie(provincie);
        } else {
            request.setAttribute("provincie", "Selecteer een Provincie");
            validity = false;
        }
        if (request.getParameter("emailAdres") != null && !request.getParameter("emailAdres").isEmpty() && ValidateMail.isEmail(request.getParameter("emailAdres"))) {
            emailAdres = request.getParameter("emailAdres");
            editLid.setLidEmail(emailAdres);
        } else {
            request.setAttribute("mail", "E-mail is incorrect");
            validity = false;
        }
        if (request.getParameter("postalcode") != null && !request.getParameter("postalcode").isEmpty()) {
            postalcode = request.getParameter("postalcode");
            editLid.setLidPostcode(postalcode);
        } else {
            request.setAttribute("post", "Postcode is leeg");
            validity = false;
        }
        if (request.getParameter("huisnummer") != null && !request.getParameter("huisnummer").isEmpty()) {
            huisnummer = request.getParameter("huisnummer");
            editLid.setLidHuisnummer(huisnummer);
        } else {
            request.setAttribute("huis", "Huisnummer is leeg");
            validity = false;
        }
        if (request.getParameter("geboortedatum") != null && !request.getParameter("geboortedatum").isEmpty()) {
            try {
                geboorteDatum = df.parse(request.getParameter("geboortedatum"));
                editLid.setLidGeboortedatum(geboorteDatum);
            } catch (ParseException ex) {
                Logger.getLogger(MijnBeheer_WijzigGebruikerController.class.getName()).log(Level.SEVERE, null, ex);
                request.setAttribute("geboortedatum", "Datumformat is onjuist");
                validity = false;
            }
        } else {
            request.setAttribute("geboortedatum", "geboortedatum is leeg");
            validity = false;
        }
        System.out.println("3 (voor boolean check)");

// De twee true/false voor Activated en deleted        
        if (request.getParameter("lidActive") != null) {
            activated = true;
        } else {
            activated = false;
        }

        if (request.getParameter("lidDeleted") != null) {
            deleted = true;
        } else {
            deleted = false;
        }

        if (!request.getParameter("rolId").equals("")) {
            rolId = Integer.parseInt(request.getParameter("rolId"));
            editLid.setRolId(rolId);
        } else {
            request.setAttribute("rolId", "Selecteer een rol");
            validity = false;
        }

// eind check --> valid or not?        
        if (validity != true) {
            address = "mijnBeheer_WijzigGebruiker.jsp";
            RequestDispatcher dispatcher = request.getRequestDispatcher(address);
            dispatcher.forward(request, response);
        } else {
            tussenvoegsel = request.getParameter("insertion");
            if (tussenvoegsel.isEmpty() && request.getParameter("insertion") == null || tussenvoegsel.equals("")) {
                displaynaam = fname.concat(" ").concat(lname);
            } else {
                displaynaam = fname.concat(" ").concat(tussenvoegsel).concat(" ").concat(lname);
            }

// set alle "nieuwe" variable            
//            editLid.setLidVnaam(fname);
//            editLid.setLidTussenvoegsel(tussenvoegsel);
//            editLid.setLidAnaam(lname);

//            editLid.setLidPassword(password);
//            editLid.setLidEmail(emailAdres);
//
//            editLid.setLidPostcode(postalcode);
//            editLid.setLidHuisnummer(huisnummer);
//            editLid.setLidProvincie(provincie);
//
//            editLid.setLidGeboortedatum(geboorteDatum);
            
            editLid.setLidDisplaynaam(displaynaam);
            editLid.setLidActivated(activated);
            editLid.setLidDeleted(deleted);

//            editLid.setRolId(rolId);

// Als new dan lid toevoegen aan DB en ook activatie email versturen.
            if (newUser) {
                System.out.println("4 new user");
                
                int random = getRandom();
                editLid.setLidLogin(fname + random);
                editLid.setLidActivationkey(ActivationKey.generateActivationKey());
                System.out.println(editLid.getLidActivationkey());
                editLid.setLidRegistered(now);

                session.save(editLid);

                String subjectActivationMail = "Activeer uw Dryves account";               
                String activationUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/Activeren?key=" + editLid.getLidActivationkey();                
                String profielUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/WijzigGebruiker";                
                String bodyActivationMail = "Beste " + editLid.getLidDisplaynaam() + ","  
                                        + "\n" 
                                        + "Er is voor u een account aangemaakt op Dryves.\n"
                                        + "Uw gebruikers naam is: " + editLid.getLidLogin() + "\n"
                                        + "Uw wachtwoord is nu ingesteld als: " + editLid.getLidPassword() + "\n"
                                        + "\n"
                                        + "Door op de volgende link te drukken activeerd u uw account:\n"
                                        + activationUrl + "\n"
                                        + "\n"
//                                        + "Geadviseerd wordt om uw wachtwoord asap te veranderen via deze link:\n"
//                                        + profielUrl + "\n"
//                                        + "\n"
                                        + "Veel plezier op dryves!\n";
             
// Stukje code van Drona voor de activatie email            
                //constructie van de activatie url
                try {
                    SendMail.send(editLid.getLidEmail(), subjectActivationMail, bodyActivationMail);
                } catch (AddressException ex) {
                    Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
                } catch (MessagingException ex) {
                    Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
                } catch (UnsupportedEncodingException ex) {
                    Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
                }
                System.out.println("5 activatie mail verzonden");
            } else {
                System.out.println("4 geen nieuwe user");
// Als niet new dan session.merge! 
// Dit is omdat er een "List<Lid> lijstAlleLeden" aangemaakt is en deze OOK moet worden bijgewerkt.                
                session.merge(editLid);
            }
            
            tx.commit();
            session.close();

            System.out.println("Hop naar MijnBeheer_LedenLijst");

            address = "MijnBeheer_LedenLijst";
            RequestDispatcher dispatcher = request.getRequestDispatcher(address);
            dispatcher.forward(request, response);
            System.out.println("7");
        }
    }

    private int getRandom() {
        Random randomGenerator = new Random();
        int randomInt = randomGenerator.nextInt(1000);
        return randomInt;
    }
}
